home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / etc / titspark.lzh / bomb.c next >
C/C++ Source or Header  |  1998-11-22  |  2KB  |  122 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <XSP2lib.H>
  4. #include "expl.h"
  5. #include "fxsp2lib.h"
  6.  
  7. #define BOMB_MAX    32    /* 最大数 */
  8.  
  9. BOMB *bomb, *bomb_top, *bomb_null_top;
  10. extern int o_option;
  11.  
  12. int bomb_init0 (void)
  13. {
  14.     int i;
  15.  
  16.     if ((bomb = malloc (sizeof (BOMB) * BOMB_MAX)) == NULL)
  17.         return (-1);
  18.  
  19.     bomb_top = NULL;
  20.     bomb_null_top = bomb;
  21.     for (i = 0; i < BOMB_MAX; i++) {
  22.         bomb[i].next = &bomb[i + 1];
  23.     }
  24.     bomb[BOMB_MAX - 1].next = NULL;
  25.  
  26.     return (0);
  27. }
  28.  
  29.  
  30. void bomb_init (signed short x, signed short y, signed int vx, signed int vy, char cyc)
  31. {
  32.     if (bomb_null_top != NULL) {
  33.         BOMB *p;
  34.  
  35.         p = bomb_null_top;
  36.         bomb_null_top = p->next;
  37.         p->next = bomb_top;
  38.         bomb_top = p;
  39.  
  40.         p->lx = x << 16;
  41.         p->ly = y << 16;
  42.         p->pt = 0;
  43.         p->info = 0x023f;
  44.         p->vx = vx;
  45.         p->vy = vy;
  46.         p->cyc = cyc;
  47.         p->cyc1 = cyc;
  48.         p->cyc2 = 0;
  49.     }
  50. }
  51.  
  52.  
  53.  
  54. void bomb_move (void)
  55. {
  56.     BOMB *p, *q;
  57.  
  58.     static short pt_table[]=
  59.     {3, 2, 1, 0};
  60.  
  61.     p = bomb_top;
  62.     q = NULL;
  63.     while (p != NULL) {
  64.         char erase_flag = 0;
  65.  
  66.         /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  67.         p->x = (p->lx += p->vx) >> 16;
  68.         p->y = (p->ly += p->vy) >> 16;
  69.  
  70.         p->vx -= p->vx * 0.1;    /* 空気抵抗 */
  71.         p->vy -= p->vy * 0.1;
  72.  
  73.         p->pt = pt_table[p->cyc2];
  74.         if (--p->cyc1 <= 0) {
  75.             p->cyc1 = p->cyc;
  76.             if (++p->cyc2 > 4)
  77.                 erase_flag = !0;
  78.         }
  79.         if (erase_flag) {
  80.             if (q == NULL) {    /* リストの一番最初を削除 */
  81.                 bomb_top = p->next;
  82.                 p->next = bomb_null_top;
  83.                 bomb_null_top = p;
  84.                 q = NULL;
  85.                 p = bomb_top;
  86.             } else {
  87.                 q->next = p->next;
  88.                 p->next = bomb_null_top;
  89.                 bomb_null_top = p;
  90.                 p = q->next;
  91.             }
  92.         } else {
  93.             p->x += (128 + 16);    /* 表示用に補正 */
  94.             p->y += (128 + 16);
  95.             p->x -= 8;
  96.             p->y -= 8;
  97.             xsp_set_st (p);
  98.             p->x -= (128 + 16);
  99.             p->y -= (128 + 16);
  100.             fxsp_set_st (p);
  101.             p->x += 8;
  102.             p->y += 8;
  103.             q = p;
  104.             p = p->next;
  105.         }
  106.     }
  107. }
  108.  
  109.  
  110. void bomb_tini (void)
  111. {
  112.     int i;
  113.  
  114.     bomb_top = NULL;
  115.     bomb_null_top = bomb;
  116.     for (i = 0; i < BOMB_MAX; i++) {
  117.         bomb[i].next = &bomb[i + 1];
  118.     }
  119.     bomb[BOMB_MAX - 1].next = NULL;
  120.  
  121. }
  122.